Data is stored in flash memory by programming flash memory cells to program levels corresponding to desired data values. As flash memory technology has improved, the number of program levels available for programming in individual flash memory cells has increased from the two program levels available in single level cell (SLC) NAND flash memory used to store one bit of data. For example, multi-level cell (MLC) NAND flash memory utilizes four program levels to store two bits of data in each flash memory cell, triple-level cell (TLC) NAND flash memory uses eight program levels to store three bits of data in each flash memory cell, and quad-level cell (QLC) NAND flash memory uses sixteen program levels to store four bits of data in each flash memory cell. As newer technologies such as 3D NAND flash memory provide even higher numbers of available program levels, the binary nature of how data currently is written to and read from flash memory impedes the performance of flash memory.